home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 4 / QRZ Ham Radio Callsign Database - Volume 4.iso / files / tcpip / amiga / asrc29p.lha / icmphdr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-29  |  1.0 KB  |  53 lines

  1. #include "global.h"
  2. #include "mbuf.h"
  3. #include "internet.h"
  4. #include "ip.h"
  5. #include "icmp.h"
  6.  
  7. /* Generate ICMP header in network byte order, link data, compute checksum */
  8. struct mbuf *
  9. htonicmp(icmp,data)
  10. struct icmp *icmp;
  11. struct mbuf *data;
  12. {
  13.     struct mbuf *bp;
  14.     register char *cp;
  15.     int16 checksum;
  16.  
  17.     if((bp = pushdown(data,ICMPLEN)) == NULLBUF)
  18.         return NULLBUF;
  19.     cp = bp->data;
  20.  
  21.     *cp++ = icmp->type;
  22.     *cp++ = icmp->code;
  23.     cp = put16(cp,0);        /* Clear checksum */
  24.     cp = put16(cp,icmp->args.echo.id);
  25.     cp = put16(cp,icmp->args.echo.seq);
  26.  
  27.     /* Compute checksum, and stash result */
  28.     checksum = cksum(NULLHEADER,bp,len_p(bp));
  29.     cp = &bp->data[2];
  30.     cp = put16(cp,checksum);
  31.  
  32.     return bp;
  33. }
  34. /* Pull off ICMP header */
  35. int
  36. ntohicmp(icmp,bpp)
  37. struct icmp *icmp;
  38. struct mbuf **bpp;
  39. {
  40.     char icmpbuf[8];
  41.  
  42.     if(icmp == (struct icmp *)NULL)
  43.         return -1;
  44.     if(pullup(bpp,icmpbuf,8) != 8)
  45.         return -1;
  46.     icmp->type = icmpbuf[0];
  47.     icmp->code = icmpbuf[1];
  48.     icmp->args.echo.id = get16(&icmpbuf[4]);
  49.     icmp->args.echo.seq = get16(&icmpbuf[6]);
  50.     return 0;
  51. }
  52.  
  53.